Description
Rewrite the following Java code using smart casts and when expression:
public int eval(Expr expr) {
if (expr instanceof Num) {
return ((Num) expr).getValue();
}
if (expr instanceof Sum) {
Sum sum = (Sum) expr;
return eval(sum.getLeft()) + eval(sum.getRight());
}
throw new IllegalArgumentException("Unknown expression");
}
Code
fun eval(expr: Expr): Int =
when (expr) {
is Num -> expr.value
is Sum -> eval(expr.left) + eval(expr.right)
else -> throw IllegalArgumentException("Unknown expression")
}
interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
Memo
- スマートキャスト
- Kotlinでは明示的にキャスト演算子を使用する必要はない
- コンパイラは
is
演算子と明示的なキャストを追跡して(必要に応じて)自動的に安全なキャストを挿入する
変数がnullableなのであれば、明示的にnullチェックをする。
var str: String?
if (str != null) {
// not-nullと推論できるので、スマートキャストされる
str.value
}
is
がJavaの instanceOf
の役割を果たしていて、さらに以降の処理ではスマートキャストされた値を使用できる。
前回のKotlin Koans 07 Nullable typesと合わせて理解することで、よりKotlinぽい安全でシンプルなコードを書けるようになる。